#include <iostream>
#include <sstream>
#include <random>
#include <chrono>
#include <string>
#include <iomanip>
#include <atomic>

namespace ns_rpc
{
    class UUID
    {
        public:
        static const std::string &uuid()
        {
            std::stringstream ss;
            std::random_device rd; // 生成一个硬件随机数 (不用根据系统时间生成的随机数种子,因为同一时刻需要大量生成uuid)
            std::mt19937 generator(rd());

            std::uniform_int_distribution<int> distribution(0, 255);
            for (int i = 0; i < 8; i++)
            {
                if (i == 4 || i == 6)
                    ss << "-";
                // 将8个数字全部插入
                ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
            }

            static std::atomic<size_t> seq(1);
            size_t cur = seq.fetch_add(1);
            for (int i = 7; i >= 0; i--)
            {
                if (i == 5)
                    ss << "-";
                ss << std::setw(2) << std::setfill('0') << std::hex << ((cur >> (i * 8)) & 0xFF);
            }
            return ss.str();
        }
    };
}

int main()
{
    ns_rpc::UUID::uuid();
    return 0;
}